package com.example.blog_system.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:系统配置文件 添加使用定义好的拦截器同时写拦截规则
 */

@Configuration
public class AppConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;
    //    读取头像文件保存的路径
    @Value("${profile_path}")
    public   String PROFILE_PATH;
    @Value("${absolute_profile_path}")
    public  String ABSOLUTE_PROFILE_PATH;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 添加 登录拦截器 (用于验证用户是否登录)
        registry.addInterceptor(loginInterceptor)
                //拦截规则  拦截所有请求
                .addPathPatterns("/**")
                //排除拦截 排除 一些静态文件的拦截 css js mag editor.md (如果拦截了 则得到的页面只有html)
                .excludePathPatterns("/css/**")
                .excludePathPatterns("/editor.md/**")
                .excludePathPatterns("/image/**")
                .excludePathPatterns("/profile/**")
                .excludePathPatterns("/js/**")

                // 排除 登录和注册相关的请求拦截 登录注册静态页面和登录注册请求处理操作   显示的图标
                .excludePathPatterns("/blog_login.html")
                .excludePathPatterns("/blog_register.html")
                .excludePathPatterns("/find_password.html")
                .excludePathPatterns("/user/login")
                .excludePathPatterns("/user/reg")
                .excludePathPatterns("/user/sendcaptcha")
                .excludePathPatterns("/user/reset")
                .excludePathPatterns("/user/tourist")
//                .excludePathPatterns("/user/modifyprofile")

                //排除 显示的网页ico图标
                .excludePathPatterns("/favicon.ico")
                .excludePathPatterns("/home/captcha");

    }

    // 添加资源访问路径
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 通过以下配置(使前端上传的文件保存在项目外 此时可以访问项目外的此目录资源)
        // 可以解决 jar包内无法存文件 导致前端无法访问上传的文件
//         配置 项目外访问路径 前端通过 /profile/** 可以访问 本机的 file://"+PROFILE_PATH  路径下的所有文件资源

        registry.addResourceHandler("/profile/**").addResourceLocations(ABSOLUTE_PROFILE_PATH);
    }

    /**
     * 解决当返回的数据是String 打包为 ajaxResult 返回 会报异常cannot be cast to java.lang.String
     * 即返回类型是String时 在同一返回前 用StringHttpMessageConverter 进行类型转换 再放到AjaxResult中返回会此异常
     * // 将此用StringHttpMessageConverter类型转换删除 即在返回数据是String时会用HttpMessageConverter 类型转换 再将其转成Ajax返回
     *
     * @param converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        WebMvcConfigurer.super.configureMessageConverters(converters);
        converters.removeIf(converter->converter instanceof StringHttpMessageConverter);
    }
}
